from machine import Pin, I2C

i2c = I2C(scl = Pin("C2"), sda = Pin("C3"))
# i2c_address = 60
i2c_address = i2c.scan()[0]

def init():
    init_command = [0xae, 0x00, 0x10, 0x40, 0xb0, 0x81,
                    0xff, 0xa0, 0xa6, 0xa8, 0x3f, 0xc0,
                    0xd3, 0x00, 0xd5, 0x80, 0xd8, 0x05,
                    0xd9, 0xf1, 0xda, 0x12, 0xdb, 0x30,
                    0x8d, 0x14]
    gImage_logo = [0X03, 0X01, 0X80, 0X00, 0X40, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X02, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03,
                   0X07, 0X1C, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X03, 0X0F, 0X3F, 0XFF, 0XFF, 0X1F, 0X00,
                   0X00, 0X00, 0X00, 0X01, 0X03, 0X07, 0X0F, 0X1C, 0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X01, 0X02, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X03, 0X0F, 0X1F, 0X7F, 0XFF, 0XFF,
                   0XF0, 0X00, 0X00, 0X00, 0X03, 0X07, 0X1F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFB, 0XF7, 0XFF, 0XDF, 0X3F,
                   0X7F, 0X7F, 0XFF, 0XFE, 0XF0, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X01, 0X03,
                   0X07, 0X07, 0X0F, 0X1E, 0X1C, 0X38, 0X70, 0X60, 0XC0, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X06, 0X1F, 0X3F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X80,
                   0X07, 0X0F, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE,
                   0XF8, 0XE1, 0X81, 0X03, 0X07, 0X07, 0X0F, 0X1F, 0X1F, 0X3F, 0X7F, 0X7E, 0XFC, 0XF8, 0XF0, 0XE0,
                   0XC0, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, 0XE0, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X80,
                   0X80, 0X80, 0X80, 0X80, 0X00, 0X01, 0X01, 0X03, 0X07, 0X07, 0X0F, 0X1F, 0X3F, 0X3F, 0X7F, 0X7F,
                   0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFC, 0XF8, 0XF0, 0XE0, 0XC0, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XC0, 0XF0, 0XF0, 0X00, 0X0C, 0X1C,
                   0X1E, 0X3E, 0X7F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFC, 0XF8, 0XF0,
                   0XE0, 0XC0, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0X07,
                   0X0F, 0X0F, 0X1F, 0X3F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8F, 0X0F, 0X0F, 0X07, 0X07, 0X03,
                   0X02, 0X02, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01,
                   0X81, 0XC3, 0XC3, 0XE7, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XCF, 0XC7, 0X83, 0X81, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X0F, 0X7F, 0X3F, 0X80, 0X80, 0XC0,
                   0XE0, 0XE0, 0XF0, 0XF8, 0XF8, 0XFC, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F,
                   0X3F, 0X1F, 0X0F, 0X03, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X0F, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0X0C,
                   0X0F, 0X07, 0X07, 0X07, 0X07, 0X07, 0X07, 0X07, 0X07, 0X87, 0XC7, 0XC3, 0XE3, 0XF3, 0XFB, 0XFB,
                   0XF8, 0XFC, 0XFE, 0XFE, 0XFF, 0XFF, 0X7F, 0X3F, 0X1F, 0X0F, 0X07, 0X03, 0X01, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XC0, 0XE0, 0XF8, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X0F,
                   0X00, 0XC0, 0XF0, 0XF8, 0XFE, 0XFF, 0XFF, 0XFF, 0XFB, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
                   0XFF, 0X3F, 0X07, 0X01, 0X00, 0X80, 0X80, 0XC0, 0XE0, 0XE0, 0XF0, 0XF8, 0XF8, 0XFC, 0X7E, 0X3E,
                   0X1F, 0X0F, 0X07, 0X03, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, 0XE0, 0XF0, 0XFC, 0XFE,
                   0X3F, 0X01, 0X00, 0X00, 0X00, 0X80, 0XE0, 0XF0, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XDF, 0XE0,
                   0XF0, 0XF8, 0XFC, 0XFE, 0X7F, 0X1F, 0X07, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X80, 0X80, 0XC0, 0XE0, 0XE0, 0X30, 0X18, 0X08, 0X04, 0X02, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X80, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XC0, 0XE0, 0XF8, 0XFE, 0XC1, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, 0XC0, 0X20, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
                   0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00
                   ]

    for i in init_command:
        i2c.writeto_mem(i2c_address, 0x00, chr(i))
    clear()
    i2c.writeto_mem(i2c_address, 0x00, chr(0xaf))

def clear():
    for i in range(8):
        i2c.writeto_mem(i2c_address, 0x00, chr(0xb0+i))
        i2c.writeto_mem(i2c_address, 0x00, chr(0x00))
        i2c.writeto_mem(i2c_address, 0x00, chr(0x10))
        for n in range(128):
            i2c.writeto_mem(i2c_address, 0x40, chr(0x00))


def set_pos(x, y):
    if x < 128 and y < 8:
        i2c.writeto_mem(i2c_address, 0x00, chr(0xb0 + y))
        i2c.writeto_mem(i2c_address, 0x00, chr(((x & 0xf0) >> 4) | 0x10))
        i2c.writeto_mem(i2c_address, 0x00, chr(x & 0x0f))

def char(x, y, ch):
    Font6x8  = [[0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
                [0x00, 0x00, 0x00, 0x2f, 0x00, 0x00],
                [0x00, 0x00, 0x07, 0x00, 0x07, 0x00],
                [0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14],
                [0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12],
                [0x00, 0x62, 0x64, 0x08, 0x13, 0x23],
                [0x00, 0x36, 0x49, 0x55, 0x22, 0x50],
                [0x00, 0x00, 0x05, 0x03, 0x00, 0x00],
                [0x00, 0x00, 0x1c, 0x22, 0x41, 0x00],
                [0x00, 0x00, 0x41, 0x22, 0x1c, 0x00],
                [0x00, 0x14, 0x08, 0x3E, 0x08, 0x14],
                [0x00, 0x08, 0x08, 0x3E, 0x08, 0x08],
                [0x00, 0x00, 0x00, 0xA0, 0x60, 0x00],
                [0x00, 0x08, 0x08, 0x08, 0x08, 0x08],
                [0x00, 0x00, 0x60, 0x60, 0x00, 0x00],
                [0x00, 0x20, 0x10, 0x08, 0x04, 0x02],
                [0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E],
                [0x00, 0x00, 0x42, 0x7F, 0x40, 0x00],
                [0x00, 0x42, 0x61, 0x51, 0x49, 0x46],
                [0x00, 0x21, 0x41, 0x45, 0x4B, 0x31],
                [0x00, 0x18, 0x14, 0x12, 0x7F, 0x10],
                [0x00, 0x27, 0x45, 0x45, 0x45, 0x39],
                [0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30],
                [0x00, 0x01, 0x71, 0x09, 0x05, 0x03],
                [0x00, 0x36, 0x49, 0x49, 0x49, 0x36],
                [0x00, 0x06, 0x49, 0x49, 0x29, 0x1E],
                [0x00, 0x00, 0x36, 0x36, 0x00, 0x00],
                [0x00, 0x00, 0x56, 0x36, 0x00, 0x00],
                [0x00, 0x08, 0x14, 0x22, 0x41, 0x00],
                [0x00, 0x14, 0x14, 0x14, 0x14, 0x14],
                [0x00, 0x00, 0x41, 0x22, 0x14, 0x08],
                [0x00, 0x02, 0x01, 0x51, 0x09, 0x06],
                [0x00, 0x32, 0x49, 0x59, 0x51, 0x3E],
                [0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C],
                [0x00, 0x7F, 0x49, 0x49, 0x49, 0x36],
                [0x00, 0x3E, 0x41, 0x41, 0x41, 0x22],
                [0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C],
                [0x00, 0x7F, 0x49, 0x49, 0x49, 0x41],
                [0x00, 0x7F, 0x09, 0x09, 0x09, 0x01],
                [0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A],
                [0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F],
                [0x00, 0x00, 0x41, 0x7F, 0x41, 0x00],
                [0x00, 0x20, 0x40, 0x41, 0x3F, 0x01],
                [0x00, 0x7F, 0x08, 0x14, 0x22, 0x41],
                [0x00, 0x7F, 0x40, 0x40, 0x40, 0x40],
                [0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F],
                [0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F],
                [0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E],
                [0x00, 0x7F, 0x09, 0x09, 0x09, 0x06],
                [0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E],
                [0x00, 0x7F, 0x09, 0x19, 0x29, 0x46],
                [0x00, 0x46, 0x49, 0x49, 0x49, 0x31],
                [0x00, 0x01, 0x01, 0x7F, 0x01, 0x01],
                [0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F],
                [0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F],
                [0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F],
                [0x00, 0x63, 0x14, 0x08, 0x14, 0x63],
                [0x00, 0x07, 0x08, 0x70, 0x08, 0x07],
                [0x00, 0x61, 0x51, 0x49, 0x45, 0x43],
                [0x00, 0x00, 0x7F, 0x41, 0x41, 0x00],
                [0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55],
                [0x00, 0x00, 0x41, 0x41, 0x7F, 0x00],
                [0x00, 0x04, 0x02, 0x01, 0x02, 0x04],
                [0x00, 0x40, 0x40, 0x40, 0x40, 0x40],
                [0x00, 0x00, 0x01, 0x02, 0x04, 0x00],
                [0x00, 0x20, 0x54, 0x54, 0x54, 0x78],
                [0x00, 0x7F, 0x48, 0x44, 0x44, 0x38],
                [0x00, 0x38, 0x44, 0x44, 0x44, 0x20],
                [0x00, 0x38, 0x44, 0x44, 0x48, 0x7F],
                [0x00, 0x38, 0x54, 0x54, 0x54, 0x18],
                [0x00, 0x08, 0x7E, 0x09, 0x01, 0x02],
                [0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C],
                [0x00, 0x7F, 0x08, 0x04, 0x04, 0x78],
                [0x00, 0x00, 0x44, 0x7D, 0x40, 0x00],
                [0x00, 0x40, 0x80, 0x84, 0x7D, 0x00],
                [0x00, 0x7F, 0x10, 0x28, 0x44, 0x00],
                [0x00, 0x00, 0x41, 0x7F, 0x40, 0x00],
                [0x00, 0x7C, 0x04, 0x18, 0x04, 0x78],
                [0x00, 0x7C, 0x08, 0x04, 0x04, 0x78],
                [0x00, 0x38, 0x44, 0x44, 0x44, 0x38],
                [0x00, 0xFC, 0x24, 0x24, 0x24, 0x18],
                [0x00, 0x18, 0x24, 0x24, 0x18, 0xFC],
                [0x00, 0x7C, 0x08, 0x04, 0x04, 0x08],
                [0x00, 0x48, 0x54, 0x54, 0x54, 0x20],
                [0x00, 0x04, 0x3F, 0x44, 0x40, 0x20],
                [0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C],
                [0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C],
                [0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C],
                [0x00, 0x44, 0x28, 0x10, 0x28, 0x44],
                [0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C],
                [0x00, 0x44, 0x64, 0x54, 0x4C, 0x44],
                [0x00, 0x00, 0x10, 0xFE, 0x82, 0x00],
                [0x00, 0x00, 0x00, 0xFF, 0x00, 0x00],
                [0x00, 0x82, 0xFE, 0x10, 0x00, 0x00],
                [0x02, 0x01, 0x01, 0x02, 0x02, 0x01]]
    i = 0
    c = ord(ch)-32
    if c < 99:
        set_pos(x, y)
    for i in range(6):
        i2c.writeto_mem(i2c_address, 0x40, gImage_logo)) # chr(Font6x8[c][i]))

def string(x, y, buf):
    for i in buf:
        if i == '\0':
            break
        char(x, y, i)
    x = x + 6
    if x > 122:
            x = 0
            y = y + 1